home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / ikap / etc1 / sincomp4.c < prev    next >
Text File  |  1999-12-22  |  2KB  |  112 lines

  1. /*
  2.     サイン波合成 試作バージョン version 1.04
  3.     
  4.     compiling :gcc -Wall -O2 -ldos sincomp4.c
  5.     
  6.                         by SJOM
  7. */
  8.  
  9.  
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <sys/dos.h>
  13. #include <math.h>
  14.  
  15.  
  16. static char *message=
  17. "        合成サイン波生成プログラム    version 1.04
  18.                     BY SJOM
  19. sinwave.x filename.p16 size(short int) α0(double) ω0 α1 ω1 α2 ω2
  20.     
  21.     Vout=α0sin(ω0t+α1sin(ω1t+α2sin(ω2t)))
  22.     
  23. ";
  24.  
  25.  
  26. static int size;
  27. static short *sound_data;
  28.  
  29. static double alpha0,alpha1,alpha2;
  30. static double omega0,omega1,omega2;
  31.  
  32.  
  33.  
  34. #define sampling_frequency    15625
  35.     /* 内蔵ADPCM用周波数。他用に変える時は、ここを変更すること。
  36.      例.CD・ま~きゅり~ゆにっと 441000 */
  37.  
  38. static void
  39. make_sinwave(void)
  40. {
  41.     int loop;
  42.     double data;
  43.     double step,t=0,pai=3.141592653589793;
  44.     
  45.     for (loop=0;loop<size;loop++)
  46.         sound_data[loop]=0;
  47.     
  48.     
  49.     step=2*pai/((double)sampling_frequency);
  50. /*
  51. 15625Hz -> 1sec 15625 short words
  52. 100Hz -> 15625/100=156.25 short words/wave
  53. 360゚=2π -> 2π/156.25 radian/step
  54. */
  55.     for (loop=0;loop<size;loop++) {
  56.         data=alpha0*sin(omega0*t+alpha1*sin(omega1*t+alpha2*sin(omega2*t)));
  57.         sound_data[loop]+=data;
  58.         t+=step;
  59.     };
  60.     
  61.     
  62. }
  63.  
  64.  
  65.  
  66. int
  67. main(int argc,char **argv)
  68. {
  69.     int fp;
  70.     if (argc<8) {
  71.         puts(message);
  72.         exit(0);
  73.     };
  74.     size=atoi(*(argv+2)) & 0xfffffff;
  75.     
  76.     alpha0=atof(*(argv+3));
  77.     omega0=atof(*(argv+4));
  78.     alpha1=atof(*(argv+5));
  79.     omega1=atof(*(argv+6));
  80.     alpha2=atof(*(argv+7));
  81.     omega2=atof(*(argv+8));
  82.     
  83.     
  84.     sound_data=_dos_malloc(size*2);
  85.     if ((void *)sound_data>=(void *)0x81000000) {
  86.         puts("メモリーが不足しています。");
  87.         exit(-1);
  88.     };
  89.     
  90.     
  91.     make_sinwave();
  92.     
  93.     _dos_delete(*(argv+1));
  94.     fp=_dos_open(*(argv+1),0x001);
  95.     if (fp<0) {
  96.         fp=_dos_create(*(argv+1),0b100000);
  97.         if (fp<0) {
  98.             printf("%s:出力ファイルがオープン出来ません!\n",*(argv+2));
  99.             exit(-1);
  100.         };
  101.         fp=_dos_open(*(argv+1),0x001);
  102.     };
  103.     _dos_seek(fp,0,0);
  104.     _dos_write(fp,(void *)sound_data,size*2);
  105.     _dos_close(fp);
  106.     _dos_mfree(sound_data);
  107.     exit(0);
  108. }
  109.  
  110.  
  111.  
  112.